﻿CREATE PROCEDURE [dbo].[Text_BookTree_Delete]
	@bookTreeId BIGINT,
	@url NVARCHAR(450)
AS
BEGIN
	DECLARE 
		@level TINYINT,
		@right_key BIGINT,
		@left_key BIGINT,
		@bookId UNIQUEIDENTIFIER


	SELECT @level = [Level], @left_key = [LeftKey], @right_key = [RightKey], @bookId = [BookId]
	FROM [dbo].[text_BookTree] AS t
	INNER JOIN [dbo].[text_BookTree_Cache] AS c ON t.[ParentBookTreeId] = c.[BookTreeId]
	WHERE t.[BookTreeId] = @bookTreeId AND c.[Url] = @url

	IF @bookId IS NULL
	RETURN

	IF EXISTS (SELECT * FROM [dbo].[text_BookTree] WHERE [ParentBookTreeId] = @bookTreeId)
	RETURN

	BEGIN TRAN

		----1. Удаляем узел (ветку):

		--DELETE FROM [dbo].[text_BookTree] 
		--WHERE [BookId] = @bookId AND [LeftKey] >= @left_key AND [RightKey] <= @right_key

		----2. Обновляем ключи оставшихся веток:

		--/*Как и в случае с добавлением обновление происходит двумя командами: обновление ключей родительской ветки и обновление ключей узлов, стоящих за родительской веткой. Следует правда учесть, что обновление будет производиться в другом порядке, так как ключи у нас уменьшаются.*/

		----2.1. Обновление родительской ветки :

		--UPDATE [dbo].[text_BookTree]
		--SET [RightKey] = [RightKey] - (@right_key - @left_key + 1)
		--WHERE [BookId] = @bookId AND [RightKey] > @right_key AND [LeftKey] < @left_key

		--/**** Так как мы не знаем точное количество подчиненных узлов, мы вычисляем длину диапазона (смещения) ключей удаляемой ветки (узла).*/

		----2.2. Обновление последующих узлов :

		--UPDATE [dbo].[text_BookTree] 
		--SET	[LeftKey] = [LeftKey] - (@right_key - @left_key + 1)
		--		, [RightKey] = [RightKey] - (@right_key - @left_key + 1) 
		--WHERE [BookId] = @bookId AND [LeftKey] > @right_key


		DELETE FROM [dbo].[text_BookTree] 
		WHERE [BookId] = @bookId AND [LeftKey] BETWEEN @left_key AND @right_key


		UPDATE [dbo].[text_BookTree]  
		SET [LeftKey] = CASE WHEN [LeftKey] > @left_key 
										THEN [LeftKey] - (@right_key - @left_key + 1) 
										ELSE [LeftKey] END, 
				[RightKey] = CASE WHEN [RightKey] > @left_key 
											THEN [RightKey] - (@right_key - @left_key + 1) 
											ELSE [RightKey] END 
		WHERE [BookId] = @bookId 


		--3. Проверяем.
		DECLARE @check_result INT
		EXEC	@check_result = [dbo].[Text_BookTree_Check] @bookId = @bookId

	IF @check_result = 0
	BEGIN
		COMMIT TRAN
	END
	ELSE
	BEGIN
		ROLLBACK TRAN
	END
END